/*
 * FdStream.h
 *
 */

#ifndef FDSTREAM_H_
#define FDSTREAM_H_

#include <sstream>
#include <vector>
#include <stdio.h>

class IFdStream {
	private:
		FILE* file;
		bool isOpen;
	public:
		IFdStream();
		explicit IFdStream(int fd);
		virtual ~IFdStream();

		/**
		 * @brief Verifica si el file descriptor esta abierto
		 *
		 * devuelve true si el stream esta asociado al descriptor, sino
		 * devuelve false
		 *
		 * @return true si esta abierto, sino false
		 */
		bool is_open() const;

		 /**
		  * Abre el file descriptor para su lectura
		  *
		  * @param fd el file descriptor que se utilizara
		  */
		void open(int fd);

		/**
		 * Cierra el file descriptor
		 */
		void close();

		char read();

		/**
		 * Lee del file descriptor la cantidad de bytes especificada
		 *
		 * @param dest array donde se almacenaran los bytes
		 * @param size cantidad de bytes a leer
		 * @return la cantidad de bytes leidos
		 */
		size_t read(char* dest, size_t size);
};

class OFdStream {
	private:
		FILE* file;
		bool isOpen;
	public:
		OFdStream();
		explicit OFdStream(int fd);
		virtual ~OFdStream();

		/**
		 * @brief Verifica si el file descriptor esta abierto
		 *
		 * devuelve true si el stream esta asociado al descriptor, sino
		 * devuelve false
		 *
		 * @return true si esta abierto, sino false
		 */
		bool is_open() const;

		 /**
		  * Abre el file descriptor para su escritura
		  *
		  * @param fd el file descriptor que se utilizara
		  */
		void open(int fd);

		/**
		 * Cierra el file descriptor
		 */
		void close();

		void write(char character);
		void write(const std::string& str);
		void write(const char* data, size_t size);
};

#endif /* FDSTREAM_H_ */
